package co.gov.medellin.ssti.sub.model.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;

import co.gov.medellin.ssti.sub.model.dao.AuditoriaDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.AreaVO;
import co.gov.medellin.ssti.sub.model.vo.AuditoriaVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;
import co.gov.medellin.ssti.sub.paoyer.administration.model.vo.UserVO;
import co.gov.medellin.ssti.sub.web.decorator.NumeroDecoratorImpl;

public class AuditoriaDAOImpl extends NamedParameterJdbcDaoSupport implements
		AuditoriaDAO {

	public Collection<UserVO> findUsers(String cedula, String descripcion) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		Collection<UserVO> users = new ArrayList<UserVO>();

		StringBuffer query = new StringBuffer(
				"SELECT codigo, nombre, SUBSTR(descripcion,1,30) descripcion "
						+ " FROM paoyer.TCS_USUARIO WHERE campo_a1 IS NULL ");

		if (cedula != null && !cedula.equalsIgnoreCase("")) {
			query.append(" AND nombre = :nombre ");
			namedParameters.put("nombre", cedula);
		}
		if (descripcion != null && !descripcion.equalsIgnoreCase("")) {
			query.append(" AND descripcion LIKE UPPER(:descripcion) ");
			namedParameters.put("descripcion", "%" + descripcion + "%");
		}
		users = getNamedParameterJdbcTemplate().query(query.toString(),
				namedParameters, new RowMapper<UserVO>() {
					public UserVO mapRow(ResultSet rs, int rowNum)
							throws SQLException {
						UserVO userVO = new UserVO();
						userVO.setCode(rs.getLong("codigo"));
						userVO.setName(rs.getString("nombre"));
						userVO.setDescription(rs.getString("descripcion"));
						return userVO;
					}
				});
		return users;
	}

	public Collection<AuditoriaVO> findReporte(String tabla,
			String fechaCreaDesde, String fechaMofificaDesde,
			String fechaCreaHasta, String fechaMofificaHasta,
			String usuarioCrea, String usuarioModifica) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		StringBuffer query = new StringBuffer(
				"SELECT "
						+ " tabla.USUARIO_CREA, TO_CHAR(tabla.FECHA_CREA,'DD/MM/RRRR') FECHA_CREA ,"
						+ " tabla.TERMINAL_CREA, tabla.USUARIO_MODIFICA, "
						+ " TO_CHAR(tabla.FECHA_MODIFICA,'DD/MM/RRRR') FECHA_MODIFICA, "
						+ " tabla.TERMINAL_MODIFICA, ");

		if (tabla.equals("TCS_BEN_BENEFICIARIO")) {
			query.append(" tabla.CODIGO, tabla.TIPO_DOCUMENTO,  tabla.NUMERO_DOCUMENTO, tabla.PRIMER_NOMBRE, "
					+ " tabla.SEGUNDO_NOMBRE, tabla.PRIMER_APELLIDO, tabla.SEGUNDO_APELLIDO "
					+ " FROM TCS_BEN_BENEFICIARIO tabla WHERE ROWNUM <= 100 ");
		} else if (tabla.equals("TCS_BEN_PROGRAMA")) {
			query.append(" tabla.CODIGO, area.NOMBRE area, usu.NOMBRE usuario, "
					+ " tabla.NOMBRE "
					+ " FROM TCS_BEN_PROGRAMA tabla, TCS_BEN_AREA area, paoyer.TCS_USUARIO usu "
					+ " WHERE ROWNUM <= 100 "
					+ " AND area.CODIGO = tabla.AREA_CODIGO "
					+ " AND usu.CODIGO = tabla.USU_CODIGO ");
		} else if (tabla.equals("TCS_BEN_SUBPROGRAMA")) {
			query.append(" tabla.CODIGO, tabla.NOMBRE, "
					+ " DECODE(tabla.VALIDAR_CONTRA_ESTUD,'S''Si','N','No') VALIDAR_CONTRA_ESTUD, "
					+ " DECODE(tabla.VALIDAR_CONTRA_SISBEN,'S''Si','N','No') VALIDAR_CONTRA_SISBEN, "
					+ " nvl(tabla.VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
					+ " pro.NOMBRE programa, usu.NOMBRE usuario, area.NOMBRE area "
					+ " FROM TCS_BEN_SUBPROGRAMA tabla, TCS_BEN_PROGRAMA pro, TCS_BEN_AREA area, paoyer.TCS_USUARIO usu "
					+ " WHERE ROWNUM <= 100 "
					+ " AND area.CODIGO = tabla.AREA_CODIGO "
					+ " AND usu.CODIGO = tabla.USU_CODIGO "
					+ " AND pro.CODIGO = tabla.PRG_CODIGO ");
		} else if (tabla.equals("TCS_BEN_SEDE")) {
			query.append(" tabla.CODIGO, tabla.NOMBRE, "
					+ " tabla.CARACTER, tabla.TIPO, vflex.NOMBRE municipio "
					+ " FROM TCS_BEN_SEDE tabla, paoyer.TCS_VALOR_FLEXIBLE vflex "
					+ " WHERE ROWNUM <= 100 "
					+ " AND vflex.CODIGO = tabla.VFL_CODIGO_MUNICIPIO ");
		} else if (tabla.equals("TCS_BEN_BENEFICIO_OTORGADO")) {
			query.append(" tabla.CODIGO, TO_CHAR(tabla.FECHA_BENEFICIO,'DD/MM/RRRR') FECHA_BENEFICIO, "
					+ " subpro.NOMBRE subprograma, "
					+ " ben.NUMERO_DOCUMENTO ||' | '|| ben.PRIMER_NOMBRE ||' '|| "
					+ " ben.SEGUNDO_NOMBRE ||' '||  ben.PRIMER_APELLIDO ||' '|| "
					+ " ben.SEGUNDO_APELLIDO beneficiario, sede.NOMBRE sede "
					+ " FROM TCS_BEN_BENEFICIO_OTORGADO tabla, TCS_BEN_BENEFICIARIO ben, TCS_BEN_SEDE sede, TCS_BEN_SUBPROGRAMA subpro "
					+ " WHERE ROWNUM <= 100 "
					+ " AND ben.CODIGO = tabla.BEN_CODIGO "
					+ " AND subpro.CODIGO = tabla.SBPR_CODIGO "
					+ " AND sede.CODIGO = tabla.SEDE_CODIGO ");
		} else if (tabla.equals("TCS_BEN_SUBP_ATR_BENEFICIARIO")) {
			query.append(" tabla.CODIGO, tabla.NOMBRE, "
					+ " DECODE(tabla.TIPO_DATO,'A','Alfanumerico','F','Fecha','N','Numerico','L','Solo letras') TIPO_DATO, "
					+ " DECODE(tabla.OBLIGATORIO,'S','Si','N','No') OBLIGATORIO, "
					+ " subpro.NOMBRE subprograma "
					+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO tabla, TCS_BEN_SUBPROGRAMA subpro "
					+ " WHERE ROWNUM <= 100 "
					+ " AND subpro.CODIGO = tabla.SBPR_CODIGO ");
		} else if (tabla.equals("TCS_BEN_SUBPROGRAMA_SEDE")) {
			query.append(" tabla.CODIGO, TO_CHAR(tabla.DESDE,'DD/MM/RRRR') DESDE, "
					+ " TO_CHAR(tabla.HASTA,'DD/MM/RRRR') HASTA, "
					+ " tabla.NUMERO_BENEFICIO, tabla.NUMERO_BEN_DISPONIBLE, "
					+ " sede.NOMBRE sede, subpro.NOMBRE subprograma "
					+ " FROM TCS_BEN_SUBPROGRAMA_SEDE tabla, TCS_BEN_SEDE sede, TCS_BEN_SUBPROGRAMA subpro "
					+ " WHERE ROWNUM <= 100 "
					+ " AND subpro.CODIGO = tabla.SBPR_CODIGO "
					+ " AND sede.CODIGO = tabla.SEDE_CODIGO ");
		}

		if (!fechaCreaDesde.equalsIgnoreCase("")
				&& !fechaCreaHasta.equalsIgnoreCase("")) {
			query.append(" AND tabla.FECHA_CREA BETWEEN TO_DATE(:fechaCreaDesde,'DD/MM/RRRR') AND TO_DATE(:fechaCreaHasta,'DD/MM/RRRR')");
			namedParameters.put("fechaCreaDesde", fechaCreaDesde);
			namedParameters.put("fechaCreaHasta", fechaCreaHasta);
		}
		if (!fechaMofificaDesde.equalsIgnoreCase("")
				&& !fechaMofificaHasta.equalsIgnoreCase("")) {
			query.append(" AND tabla.FECHA_MODIFICA BETWEEN TO_DATE(:fechaMofificaDesde,'DD/MM/RRRR') AND TO_DATE(:fechaMofificaHasta,'DD/MM/RRRR')");
			namedParameters.put("fechaMofificaDesde", fechaMofificaDesde);
			namedParameters.put("fechaMofificaHasta", fechaMofificaHasta);
		}
		if (!usuarioCrea.equalsIgnoreCase("")) {
			query.append(" AND tabla.USUARIO_CREA = :USUARIO_CREA ");
			namedParameters.put("USUARIO_CREA", usuarioCrea);
		}
		if (!usuarioModifica.equalsIgnoreCase("")) {
			query.append(" AND tabla.USUARIO_MODIFICA = :USUARIO_MODIFICA ");
			namedParameters.put("USUARIO_MODIFICA", usuarioModifica);
		}
		query.append(" ORDER BY tabla.codigo DESC ");

		Collection<AuditoriaVO> reporte = new ArrayList<AuditoriaVO>();

		List<Map<String, Object>> rows = getNamedParameterJdbcTemplate()
				.queryForList(query.toString(), namedParameters);
		for (Map<String, Object> row : rows) {
			AuditoriaVO rep = new AuditoriaVO();
			rep.setUsuarioCrea((String) row.get("USUARIO_CREA"));
			rep.setFechaCrea((String) row.get("FECHA_CREA"));
			rep.setTerminalCrea((String) row.get("TERMINAL_CREA"));
			rep.setUsuarioModifica((String) row.get("USUARIO_MODIFICA"));
			rep.setFechaModifica((String) row.get("FECHA_MODIFICA"));
			rep.setTerminalModifica((String) row.get("TERMINAL_MODIFICA"));
			if (tabla.equals("TCS_BEN_BENEFICIARIO")) {
				rep.setColumna1((String) row.get("CODIGO"));
				rep.setColumna2((String) row.get("TIPO_DOCUMENTO"));
				rep.setColumna3((String) row.get("NUMERO_DOCUMENTO"));
				rep.setColumna4((String) row.get("PRIMER_NOMBRE"));
				rep.setColumna5((String) row.get("SEGUNDO_NOMBRE"));
				rep.setColumna6((String) row.get("PRIMER_APELLIDO"));
				rep.setColumna7((String) row.get("SEGUNDO_APELLIDO"));
			} else if (tabla.equals("TCS_BEN_PROGRAMA")) {
				rep.setColumna1((String) row.get("CODIGO"));
				rep.setColumna2((String) row.get("NOMBRE"));
				rep.setColumna4((String) row.get("AREA"));
				rep.setColumna5((String) row.get("USUARIO"));
			} else if (tabla.equals("TCS_BEN_SUBPROGRAMA")) {
				rep.setColumna1((String) row.get("CODIGO"));
				rep.setColumna2((String) row.get("NOMBRE"));
				rep.setColumna3((String) row.get("PROGRAMA"));
				rep.setColumna4((String) row.get("USUARIO"));
				rep.setColumna5((String) row.get("AREA"));
				rep.setColumna6((String) row.get("VALIDAR_CONTRA_ESTUD"));
				rep.setColumna7((String) row.get("VALIDAR_CONTRA_SISBEN"));
				rep.setColumna8((String) row.get("VALOR_UNITARIO_BENEFICIO"));

			} else if (tabla.equals("TCS_BEN_SEDE")) {
				rep.setColumna1((String) row.get("CODIGO"));
				rep.setColumna2((String) row.get("NOMBRE"));
				rep.setColumna3((String) row.get("MUNICIPIO"));
				rep.setColumna4((String) row.get("CARACTER"));
				rep.setColumna5((String) row.get("TIPO"));

			} else if (tabla.equals("TCS_BEN_BENEFICIO_OTORGADO")) {
				rep.setColumna1((String) row.get("CODIGO"));
				rep.setColumna2((String) row.get("SUBPROGRAMA"));
				rep.setColumna3((String) row.get("BENEFICIARIO"));
				rep.setColumna4((String) row.get("SEDE"));
				rep.setColumna5((String) row.get("FECHA_BENEFICIO"));

			} else if (tabla.equals("TCS_BEN_SUBP_ATR_BENEFICIARIO")) {
				rep.setColumna1((String) row.get("CODIGO"));
				rep.setColumna2((String) row.get("NOMBRE"));
				rep.setColumna3((String) row.get("SUBPROGRAMA"));
				rep.setColumna4((String) row.get("TIPO_DATO"));
				rep.setColumna5((String) row.get("OBLIGATORIO"));

			} else if (tabla.equals("TCS_BEN_SUBPROGRAMA_SEDE")) {
				rep.setColumna1((String) row.get("CODIGO"));
				rep.setColumna2((String) row.get("SEDE"));
				rep.setColumna3((String) row.get("SUBPROGRAMA"));
				rep.setColumna4((String) row.get("DESDE"));
				rep.setColumna5((String) row.get("HASTA"));
				rep.setColumna6((String) row.get("NUMERO_BENEFICIO"));
				rep.setColumna7((String) row.get("NUMERO_BEN_DISPONIBLE"));
			}
			reporte.add(rep);
		}
		return reporte;
	}

	public Long findCantidadRegistros(String tabla, String fechaCreaDesde,
			String fechaMofificaDesde, String fechaCreaHasta,
			String fechaMofificaHasta, String usuarioCrea,
			String usuarioModifica) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		StringBuffer query = new StringBuffer("SELECT COUNT(1) Cantidad ");

		if (tabla.equals("TCS_BEN_BENEFICIARIO")) {
			query.append(" FROM TCS_BEN_BENEFICIARIO tabla WHERE 1 = 1 ");
		} else if (tabla.equals("TCS_BEN_PROGRAMA")) {
			query.append(" FROM TCS_BEN_PROGRAMA tabla, TCS_BEN_AREA area, paoyer.TCS_USUARIO usu "
					+ " WHERE 1 = 1 "
					+ " AND area.CODIGO = tabla.AREA_CODIGO "
					+ " AND usu.CODIGO = tabla.USU_CODIGO ");
		} else if (tabla.equals("TCS_BEN_SUBPROGRAMA")) {
			query.append(" FROM TCS_BEN_SUBPROGRAMA tabla, TCS_BEN_PROGRAMA pro, TCS_BEN_AREA area, paoyer.TCS_USUARIO usu "
					+ " WHERE 1 = 1 "
					+ " AND area.CODIGO = tabla.AREA_CODIGO "
					+ " AND usu.CODIGO = tabla.USU_CODIGO "
					+ " AND pro.CODIGO = tabla.PRG_CODIGO ");
		} else if (tabla.equals("TCS_BEN_SEDE")) {
			query.append("FROM TCS_BEN_SEDE tabla, paoyer.TCS_VALOR_FLEXIBLE vflex "
					+ " WHERE 1 = 1 "
					+ " AND vflex.CODIGO = tabla.VFL_CODIGO_MUNICIPIO ");
		} else if (tabla.equals("TCS_BEN_BENEFICIO_OTORGADO")) {
			query.append(" FROM TCS_BEN_BENEFICIO_OTORGADO tabla, TCS_BEN_BENEFICIARIO ben, TCS_BEN_SEDE sede, TCS_BEN_SUBPROGRAMA subpro "
					+ " WHERE 1 = 1 "
					+ " AND ben.CODIGO = tabla.BEN_CODIGO "
					+ " AND subpro.CODIGO = tabla.SBPR_CODIGO "
					+ " AND sede.CODIGO = tabla.SEDE_CODIGO ");

		} else if (tabla.equals("TCS_BEN_SUBP_ATR_BENEFICIARIO")) {
			query.append(" FROM TCS_BEN_SUBP_ATR_BENEFICIARIO tabla, TCS_BEN_SUBPROGRAMA subpro "
					+ " WHERE 1 = 1 "
					+ " AND subpro.CODIGO = tabla.SBPR_CODIGO ");
		} else if (tabla.equals("TCS_BEN_SUBPROGRAMA_SEDE")) {
			query.append("FROM TCS_BEN_SUBPROGRAMA_SEDE tabla, TCS_BEN_SEDE sede, TCS_BEN_SUBPROGRAMA subpro "
					+ " WHERE 1 = 1 "
					+ " AND subpro.CODIGO = tabla.SBPR_CODIGO "
					+ " AND sede.CODIGO = tabla.SEDE_CODIGO ");
		}

		if (!fechaCreaDesde.equalsIgnoreCase("")
				&& !fechaCreaHasta.equalsIgnoreCase("")) {
			query.append(" AND tabla.FECHA_CREA BETWEEN TO_DATE(:fechaCreaDesde,'DD/MM/RRRR') AND TO_DATE(:fechaCreaHasta,'DD/MM/RRRR')");
			namedParameters.put("fechaCreaDesde", fechaCreaDesde);
			namedParameters.put("fechaCreaHasta", fechaCreaHasta);
		}
		if (!fechaMofificaDesde.equalsIgnoreCase("")
				&& !fechaMofificaHasta.equalsIgnoreCase("")) {
			query.append(" AND tabla.FECHA_MODIFICA BETWEEN TO_DATE(:fechaMofificaDesde,'DD/MM/RRRR') AND TO_DATE(:fechaMofificaHasta,'DD/MM/RRRR')");
			namedParameters.put("fechaMofificaDesde", fechaMofificaDesde);
			namedParameters.put("fechaMofificaHasta", fechaMofificaHasta);
		}
		if (!usuarioCrea.equalsIgnoreCase("")) {
			query.append(" AND tabla.USUARIO_CREA = :USUARIO_CREA ");
			namedParameters.put("USUARIO_CREA", usuarioCrea);
		}
		if (!usuarioModifica.equalsIgnoreCase("")) {
			query.append(" AND tabla.USUARIO_MODIFICA = :USUARIO_MODIFICA ");
			namedParameters.put("USUARIO_MODIFICA", usuarioModifica);
		}

		Long ret = getNamedParameterJdbcTemplate().queryForObject(
				query.toString(), namedParameters, Long.class);

		if (ret != null && ret.longValue() > 0) {
			return ret;
		} else {
			throw new DAOException("No se encontraron registros.");
		}

	}

	public Collection<AreaVO> selectSecretaria(int iCodeUser,
			String strGroupUser) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();
		if (strGroupUser == null || strGroupUser.isEmpty()) {
			throw new DAOException("El grupo del usuario no puede ser vacio.");
		}

		StringBuffer query = new StringBuffer();

		if (strGroupUser.equals("ADMINISTRADOR GENERAL")
				|| strGroupUser.equals("SUPER USUARIO")) {
			query.append("SELECT distinct area.CODIGO CODIGO, area.NOMBRE NOMBRE "
					+ " FROM tcs_ben_area area "
					+ " WHERE area.AREA_CODIGO IS NULL ");
		} else {
			query.append("SELECT distinct area.CODIGO CODIGO, area.NOMBRE NOMBRE "
					+ " FROM tcs_ben_area area, paoyer.tcs_usuario usu "
					+ " WHERE usu.CAMPO_N1 = area.CODIGO ");
		}

		if (!strGroupUser.equals("ADMINISTRADOR GENERAL")
				&& !strGroupUser.equals("SUPER USUARIO")) {
			query.append(" AND usu.CODIGO = :CODIGO ");
			namedParameters.put("CODIGO", iCodeUser);
		}
		query.append(" ORDER BY area.NOMBRE ");

		List<AreaVO> result = getNamedParameterJdbcTemplate().query(
				query.toString(), namedParameters, new RowMapper<AreaVO>() {
					public AreaVO mapRow(ResultSet rs, int rowNum)
							throws SQLException {
						AreaVO areaVO = new AreaVO();
						areaVO.setCodearea(rs.getString("CODIGO"));
						areaVO.setNombre(rs.getString("NOMBRE"));
						return areaVO;
					}
				});
		return result;
	}

	public Collection<UserVO> findUserAdm(String strNameGroup, Long lCodeArea,
			String strNameUser, String strFind) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		StringBuffer query = new StringBuffer(
				"SELECT usu.CODIGO, usu.NOMBRE, usu.DESCRIPCION "
						+ " FROM paoyer.tcs_usuario usu "
						+ " WHERE Fcs_Val_Est_Vigencia(usu.VIGENCIA) = 'S' ");

		if (lCodeArea != null && lCodeArea.longValue() != 0) {
			query.append("AND usu.CAMPO_N1 = :CAMPO_N1 ");
			namedParameters.put("CAMPO_N1", lCodeArea);
		} else {
			if (!strNameGroup.equals("ADMINISTRADOR GENERAL")
					&& !strNameGroup.equals("SUPER USUARIO")) {
				query.append(" AND usu.CAMPO_N1 = :CAMPO_N1 ");
				namedParameters.put("CAMPO_N1", lCodeArea);
			} else {
				if (!strNameGroup.equals("ADMINISTRADOR GENERAL")
						&& !strNameGroup.equals("SUPER USUARIO")) {
					if (lCodeArea != null && lCodeArea.longValue() != 0) {
						query.append(" AND usu.CAMPO_N1 = :CAMPO_N1 ");
						namedParameters.put("CAMPO_N1", lCodeArea);
					}
				}
			}
		}

		if (strFind != null && strFind.equals("nombre")) {
			if (strNameUser != null && !strNameUser.equals("")) {
				query.append(" AND usu.NOMBRE LIKE UPPER(:NOMBRE) ");
				namedParameters.put("NOMBRE", "%" + strNameUser + "%");
			}
		} else {
			if (strNameUser != null && !strNameUser.equals("")) {
				query.append(" AND usu.DESCRIPCION LIKE UPPER(:DESCRIPCION) ");
				namedParameters.put("DESCRIPCION", "%" + strNameUser + "%");
			}
		}
		query.append(" ORDER BY NOMBRE");

		List<UserVO> userAdmin = getNamedParameterJdbcTemplate().query(
				query.toString(), namedParameters, new RowMapper<UserVO>() {
					public UserVO mapRow(ResultSet rs, int rowNum)
							throws SQLException {
						UserVO userVO = new UserVO();
						userVO.setCode(rs.getLong("CODIGO"));
						userVO.setName(rs.getString("NOMBRE"));
						userVO.setDescription(rs.getString("DESCRIPCION"));
						return userVO;
					}
				});

		return userAdmin;
	}

	public Collection<AuditoriaVO> findReportControl(SubprogramaVO criteria) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		StringBuffer query = new StringBuffer(
				"SELECT area.NOMBRE SECRETARIA, prog.NOMBRE NOMPRO, sub.NOMBRE NOMSUB, "
						+ "(SELECT COUNT(1) FROM tcs_ben_beneficio_otorgado bot "
						+ " WHERE bot.SBPR_CODIGO = sub.CODIGO "
						+ " AND bot.USUARIO_CREA = :USUARIO_CREA) CANTIDAD "
						+ " FROM tcs_ben_programa prog, tcs_ben_subprograma sub, tcs_ben_area area "
						+ " WHERE prog.CODIGO = sub.PRG_CODIGO "
						+ " AND area.CODIGO = prog.AREA_CODIGO "
						+ " AND sub.CODIGO in (SELECT bot.SBPR_CODIGO "
						+ "      FROM tcs_ben_beneficio_otorgado bot "
						+ "      WHERE bot.USUARIO_CREA = :USUARIO_CREA ");

		namedParameters.put("USUARIO_CREA", criteria.getNombreUsuario());

		if (!criteria.getDesdeVigencia().equals("")
				&& !criteria.getHastaVigencia().equals("")) {
			query.append(" AND bot.FECHA_CREA >= TO_DATE(:FECHA_CREA_DESDE,'DD/MM/RRRR') AND bot.FECHA_CREA < TO_DATE(:FECHA_CREA_HASTA,'DD/MM/RRRR')) ");
			namedParameters
					.put("FECHA_CREA_DESDE", criteria.getDesdeVigencia());
			namedParameters
					.put("FECHA_CREA_HASTA", criteria.getHastaVigencia());
		} else {
			if (!criteria.getDesdeVigencia().equals("")) {
				query.append(" AND bot.FECHA_CREA >= TO_DATE(:FECHA_CREA_DESDE,'DD/MM/RRRR')) ");
				namedParameters.put("FECHA_CREA_DESDE",
						criteria.getDesdeVigencia());
			} else {
				if (!criteria.getHastaVigencia().equals("")) {
					query.append(" AND bot.FECHA_CREA <= TO_DATE(:FECHA_CREA_HASTA,'DD/MM/RRRR')) ");
					namedParameters.put("FECHA_CREA_HASTA",
							criteria.getHastaVigencia());
				} else {
					query.append(") ");
				}
			}
		}

		if ((Object) criteria.getCodeSubPrograma() != null) {
			query.append(" AND sub.CODIGO = :sub.CODIGO ");
			namedParameters.put("sub.CODIGO", criteria.getCodeSubPrograma());
		}
		if ((Object) criteria.getCodePrograma() != null) {
			query.append(" AND prog.CODIGO = :prog.CODIGO ");
			namedParameters.put("prog.CODIGO", criteria.getCodePrograma());
		}
		query.append(" ORDER BY area.NOMBRE, prog.NOMBRE");

		int iContSecr = 0;
		String strAntSecr = "";
		int iContProg = 0;
		String strAntProg = "";
		int iContBen = 0;
		int iContCant = 0;

		ArrayList<AuditoriaVO> report = new ArrayList<AuditoriaVO>();

		List<Map<String, Object>> rows = getNamedParameterJdbcTemplate()
				.queryForList(query.toString(), namedParameters);
		for (Map<String, Object> row : rows) {
			AuditoriaVO objAuditoriaVO = new AuditoriaVO();
			objAuditoriaVO.setColumna1((String) row.get("SECRETARIA"));
			objAuditoriaVO.setColumna2((String) row.get("NOMPRO"));
			objAuditoriaVO.setColumna3((String) row.get("NOMSUB"));
			objAuditoriaVO.setColumna4((String) row.get("CANTIDAD"));

			if (!strAntSecr.equals((String) row.get("SECRETARIA")))
				iContSecr += 1;
			if (!strAntProg.equals((String) row.get("NOMPRO")))
				iContProg += 1;
			iContBen += 1;
			iContCant += (Integer) row.get("CANTIDAD");
			strAntSecr = (String) row.get("SECRETARIA");
			strAntProg = (String) row.get("NOMPRO");

			report.add(objAuditoriaVO);
		}
		if (iContCant != 0 && iContBen != 0) {
			AuditoriaVO vo = new AuditoriaVO();
			vo.setColumna1("TOTAL:");
			vo.setColumna2("TOTAL:");
			vo.setColumna3("TOTAL:");
			vo.setColumna4("TOTAL:");
			report.add(vo);

			vo = new AuditoriaVO();
			vo.setColumna1(NumeroDecoratorImpl.dF.format(iContSecr));
			vo.setColumna2(NumeroDecoratorImpl.dF.format(iContProg));
			vo.setColumna3(NumeroDecoratorImpl.dF.format(iContBen));
			vo.setColumna4(NumeroDecoratorImpl.dF.format(iContCant));
			report.add(vo);
		}
		return report;
	}

	public String findDescriptionUser(String strNumberDocument) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT descripcion FROM paoyer.tcs_usuario "
				+ "WHERE nombre = :nombre ";
		return getNamedParameterJdbcTemplate().queryForObject(query,
				namedParameters, String.class);
	}

}
